package service

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"runtime"

	"gitee.com/liumou_site/logger"
)

// SelfCopy 自我复制到指定路径
// 根据操作系统平台自动选择合适的默认路径
func SelfCopy(targetPath string) error {
	// 获取当前可执行文件路径
	exePath, err := os.Executable()
	if err != nil {
		return fmt.Errorf("获取当前可执行文件路径失败: %v", err)
	}

	// 如果未指定目标路径，使用默认路径
	if targetPath == "" {
		targetPath = getDefaultServicePath()
	}

	// 确保目标目录存在
	targetDir := filepath.Dir(targetPath)
	if err := os.MkdirAll(targetDir, 0755); err != nil {
		return fmt.Errorf("创建目标目录失败: %v", err)
	}

	// 检查目标文件是否已存在且相同
	if filesAreEqual(exePath, targetPath) {
		logger.Info("目标文件已存在且内容相同，无需复制")
		return nil
	}

	// 如果目标文件已存在，先备份
	if _, err := os.Stat(targetPath); err == nil {
		backupPath := targetPath + ".backup"
		if err := copyFile(targetPath, backupPath); err != nil {
			logger.Warn("备份原文件失败: %v", err)
		} else {
			logger.Info("已备份原文件到: %s", backupPath)
		}
	}

	// 执行复制
	if err := copyFile(exePath, targetPath); err != nil {
		return fmt.Errorf("复制文件失败: %v", err)
	}

	// 设置可执行权限（Unix系统）
	if runtime.GOOS != "windows" {
		if err := os.Chmod(targetPath, 0755); err != nil {
			logger.Warn("设置文件权限失败: %v", err)
		}
	}

	logger.Info("文件已成功复制到: %s", targetPath)
	return nil
}

// getDefaultServicePath 获取默认服务路径
func getDefaultServicePath() string {
	switch runtime.GOOS {
	case "windows":
		return "C:\\Program Files\\PasswordReset\\PasswordReset.exe"
	case "linux":
		return "/usr/local/bin/PasswordReset"
	default:
		return "/usr/local/bin/PasswordReset"
	}
}

// copyFile 复制文件
func copyFile(src, dst string) error {
	sourceFile, err := os.Open(src)
	if err != nil {
		return err
	}
	defer sourceFile.Close()

	destFile, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer destFile.Close()

	_, err = io.Copy(destFile, sourceFile)
	return err
}

// filesAreEqual 比较两个文件是否相同
func filesAreEqual(file1, file2 string) bool {
	info1, err1 := os.Stat(file1)
	info2, err2 := os.Stat(file2)

	if err1 != nil || err2 != nil {
		return false
	}

	// 比较文件大小
	if info1.Size() != info2.Size() {
		return false
	}

	// 读取文件内容进行比较
	f1, err := os.ReadFile(file1)
	if err != nil {
		return false
	}

	f2, err := os.ReadFile(file2)
	if err != nil {
		return false
	}

	return string(f1) == string(f2)
}

// EnsureServiceFile 确保服务文件在正确位置
// 如果文件不在默认位置，自动复制过去
func EnsureServiceFile() (string, error) {
	defaultPath := getDefaultServicePath()

	// 获取当前可执行文件路径
	currentPath, err := os.Executable()
	if err != nil {
		return "", fmt.Errorf("获取当前可执行文件路径失败: %v", err)
	}

	// 如果当前路径就是默认路径，无需操作
	if currentPath == defaultPath {
		logger.Info("程序已在默认服务路径: %s", defaultPath)
		return defaultPath, nil
	}

	// 否则复制到默认路径
	logger.Info("程序不在默认服务路径，正在复制...")
	if err := SelfCopy(defaultPath); err != nil {
		return "", fmt.Errorf("复制服务文件失败: %v", err)
	}

	return defaultPath, nil
}

// GetServicePath 获取服务路径（可能经过复制）
func GetServicePath() (string, error) {
	return EnsureServiceFile()
}

// RemoveServiceFile 删除服务文件
func RemoveServiceFile() error {
	defaultPath := getDefaultServicePath()

	// 检查文件是否存在
	if _, err := os.Stat(defaultPath); os.IsNotExist(err) {
		logger.Info("服务文件不存在: %s", defaultPath)
		return nil
	}

	// 删除文件
	if err := os.Remove(defaultPath); err != nil {
		return fmt.Errorf("删除服务文件失败: %v", err)
	}

	logger.Info("服务文件已删除: %s", defaultPath)
	return nil
}
